home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / univspl / audioc.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-03  |  4.5 KB  |  199 lines

  1. //---------------------------------------------------------------------------
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "uspl.h"
  6. #include "audioc.h"
  7. //---------------------------------------------------------------------------
  8. AudioC::AudioC(char *fname)
  9. {
  10.    // initialize
  11.    init();
  12.  
  13.    // attempt to load file
  14.    if (ReadFile(fname)==0) this->~AudioC();
  15. }
  16.  
  17. //copy constructor
  18. AudioC::AudioC(AudioC &orig)
  19. {
  20.    init();
  21.    MaxBytes=orig.MaxBytes;
  22.    NumSamps=orig.NumSamps;
  23.    // copy header
  24.    Hdr=orig.Hdr;
  25.    Buf=(char*) malloc(MaxBytes);
  26.    // copy data
  27.    if (Buf!=NULL) memcpy(Buf,orig.Buf,MaxBytes);
  28. }
  29. AudioC::~AudioC()
  30. {
  31.    if (Buf!=NULL) free(Buf);
  32. }
  33.  
  34. void AudioC::init()
  35. {
  36.    NumSamps=0;
  37.    MaxBytes=0;
  38.    Buf=NULL;
  39.  
  40.    Hdr.Channels=2;
  41.    Hdr.SampleRate=22050;
  42.    Hdr.BitsPerSample=16;
  43.    Hdr.BlockAlign=(short) (Hdr.Channels*Hdr.BitsPerSample / 8);
  44.    Hdr.BytesPerSec=Hdr.SampleRate*Hdr.BlockAlign;
  45.    Hdr.DataLength=NumSamps*Hdr.BlockAlign;
  46.  
  47. }
  48. unsigned long AudioC::SetSampleRate(unsigned long SampleRate)
  49. {
  50.    Hdr.SampleRate=SampleRate;
  51.    return(SampleRate);
  52. }
  53.  
  54. char * AudioC::SetBuffer(char *NewBuf,unsigned long NewNumBytes)
  55. {
  56. char *tbuf;
  57.  
  58.   tbuf=Buf;
  59.   // see if we have enough room
  60.   if (NewNumBytes>MaxBytes)
  61.   {
  62.      Buf=(char*) realloc(Buf,NewNumBytes);
  63.      if (Buf==NULL)
  64.      {
  65.         Buf=tbuf;
  66.         return NULL;
  67.     }
  68.     else MaxBytes=NewNumBytes;
  69.   }
  70.  
  71.   memcpy(Buf,NewBuf,NewNumBytes);
  72.   return (Buf);
  73. }
  74.  
  75. short AudioC::SetNumChan(short NumChan)
  76. {
  77.    if (NumChan!=1 && NumChan!=2) return(0);
  78.    Hdr.Channels=NumChan;
  79.    return(Hdr.Channels);
  80. }
  81.  
  82. short AudioC::SetBitsPerSamp(short BitsPerSamp)
  83. {
  84.    if (BitsPerSamp!=8 && BitsPerSamp!=16) return(0);
  85.    Hdr.BitsPerSample=BitsPerSamp;
  86.  
  87.    // make changes to lengths
  88.    Hdr.BlockAlign=(short) (Hdr.Channels*Hdr.BitsPerSample / 8);
  89.    Hdr.BytesPerSec=Hdr.SampleRate*Hdr.BlockAlign;
  90.    Hdr.DataLength=NumSamps*Hdr.BlockAlign;
  91.  
  92.    return(Hdr.BitsPerSample);
  93. }
  94.  
  95. unsigned long AudioC::SetNumSamps(unsigned long Num)
  96. {
  97. char *tbuf;
  98.  
  99.    if (Num*Hdr.BlockAlign>MaxBytes)
  100.    {
  101.       tbuf=Buf;
  102.       Buf=(char *) realloc(Buf,Num*Hdr.BlockAlign);
  103.   }
  104.   
  105.   // did we get a good buffer?
  106.   if (Buf==NULL)
  107.   {
  108.      Buf=tbuf;
  109.      return(0);
  110.   }
  111.    NumSamps=Num;
  112.    MaxBytes=Num*Hdr.BlockAlign;
  113.    // make changes to lengths
  114.    Hdr.BlockAlign=(short) (Hdr.Channels*Hdr.BitsPerSample / 8);
  115.    Hdr.BytesPerSec=Hdr.SampleRate*Hdr.BlockAlign;
  116.    Hdr.DataLength=NumSamps*Hdr.BlockAlign;
  117.    return (NumSamps);
  118. }
  119.  
  120.  
  121. long AudioC::WriteFile(char *fname)
  122. {
  123. FILE *fptr;
  124. long status=1;
  125.  
  126.   // Some Basic Error Checking
  127.   if (Hdr.Channels!=1 && Hdr.Channels!=2) return(0);
  128.   if (Hdr.BitsPerSample!=8 && Hdr.BitsPerSample!=16) return(0);
  129.   
  130.   strncpy(Hdr.RIFF,"RIFF",4);
  131.   strncpy(Hdr.FormatType,"WAVE",4);
  132.   strncpy(Hdr.ChunkType,"fmt ",4);
  133.   strncpy(Hdr.DATA,"data",4);
  134.   Hdr.FormatTag=1;     // PCM only
  135.   Hdr.ChunkLength=16;  // hard coded
  136.   Hdr.BlockAlign=(short) (Hdr.Channels*Hdr.BitsPerSample / 8);
  137.   Hdr.BytesPerSec=Hdr.SampleRate*Hdr.BlockAlign;
  138.   Hdr.DataLength=NumSamps*Hdr.BlockAlign;
  139.   Hdr.FileLength=sizeof(Hdr)+Hdr.DataLength-8;
  140.  
  141.   if ((fptr=fopen(fname,"wb"))==NULL) status=0;
  142.   if (status && fwrite(&Hdr,sizeof(Hdr),1,fptr)!=1) status=0;
  143.   if (status && fwrite(Buf,Hdr.DataLength,1,fptr)!=1) status=0;
  144.   fclose(fptr);
  145.   return(status);
  146. }
  147.  
  148.  
  149. long AudioC::ReadFile(char *fname)
  150. {
  151. FILE *fptr;
  152. bool status;
  153. WaveHeaderStruct thdr;
  154. char *tbuf;
  155.  
  156.    // Open File
  157.    fptr=fopen(fname,"rb");
  158.    if (fptr!=NULL) status=true;
  159.       else status=false;
  160.  
  161.    // Read Header
  162.    if (status && (fread(&thdr,sizeof(thdr),1,fptr)!=1)) status=false;
  163.  
  164.    // We couldn't load the file
  165.    if (!status)
  166.    {
  167.       return(0);
  168.    }
  169.    // Everything OK so far
  170.    else
  171.    {
  172.       // Load Data
  173.       // is there enough room in our buffer?
  174.       if (MaxBytes<thdr.DataLength)
  175.       {
  176.          tbuf=Buf;
  177.          Buf=(char *) realloc(Buf,thdr.DataLength);
  178.          if (Buf!=NULL) MaxBytes=thdr.DataLength;
  179.       }
  180.       // did we get a good buffer?
  181.       if (Buf==NULL)
  182.       {
  183.          status=false;
  184.          Buf=tbuf;
  185.       }
  186.       if (status && (fread(Buf,thdr.DataLength,1,fptr)!=1)) status=false;
  187.  
  188.       if (status)
  189.       {
  190.          memcpy(&Hdr,&thdr,sizeof(WaveHeaderStruct));
  191.          NumSamps=Hdr.DataLength/Hdr.BlockAlign;
  192.       }
  193.       // Close the File
  194.       if (fptr!=NULL) fclose(fptr);
  195.    }
  196.    if (status) return(1); else return(0);
  197. }
  198.  
  199.